package com.controller.user;

import com.entity.Goods;
import com.entity.GoodsBasic;
import com.service.user.CollectionService;
import com.service.user.FootprintService;
import com.service.user.GoodService;
import com.service.user.ShoppingCarService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 响应商品详情页的控制器
 *
 * 
 */
@RestController
@CrossOrigin
public class GoodsController {
  @Autowired GoodService goodService;

  @Autowired FootprintService footprintService;

  @Autowired ShoppingCarService shoppingCarService;

  @Autowired CollectionService collectionService;

  /**
   * 获取分页书籍
   *
   * @param pageSize 页大小
   * @param pageIndex 页索引 以下为非必须
   * @param status 书籍状态 默认为1
   * @param fromPrice 最低价 默认为0
   * @param toPrice 最高价 默认为10000
   * @param categoryId 种类编号
   * @param name 书名
   * @param userId 卖家编号
   * @param fromUpdateTime 最早更新时间
   * @param toUpdateTime 最迟更新时间
   * @param fromPublicDate 最早出版日期
   * @param toPublicDate 最迟出版日期
   * @param author 作者
   * @param appearance 品相
   * @param pressHorse 出版社
   * @param sortWay 交易方式
   * @return 筛选出的分页书籍
   */
  @GetMapping("getGoods")
  public List<Goods> getGoods(
      @RequestParam("pageSize") int pageSize,
      @RequestParam("pageIndex") int pageIndex,
      String goodId,
      @RequestParam(value = "status", defaultValue = "1") int status,
      Float fromPrice,
      Float toPrice,
      Integer categoryId,
      String name,
      String userId,
      Date fromUpdateTime,
      Date toUpdateTime,
      Date fromPublicDate,
      Date toPublicDate,
      String author,
      String appearance,
      String pressHorse,
      String sortWay) {
    return goodService.getGoods(
        pageSize,
        pageIndex,
        goodId,
        status,
        fromPrice,
        toPrice,
        categoryId,
        name,
        userId,
        fromUpdateTime,
        toUpdateTime,
        fromPublicDate,
        toPublicDate,
        author,
        appearance,
        pressHorse,
        sortWay);
  }

  /**
   * 根据关键字搜索
   *
   * @param keyWords 关键字
   * @param sortBy sortBy
   * @param sortWay sortWay 升序asc/或降序desc
   * @param pageSize 页大小
   * @param pageIndex 页索引
   * @return 指定页的商品搜索结果
   */
  //  @GetMapping("searchGoods")
  //  public List<GoodsBasic> searchGoods(
  //      @RequestParam("keyWords") String keyWords,
  //      @RequestParam("sortBy") int sortBy,
  //      @RequestParam("sortWay") String sortWay,
  //      @RequestParam("pageSize") int pageSize,
  //      @RequestParam("pageIndex") int pageIndex) {
  //    return goodService.searchGoods(keyWords, sortBy, sortWay, pageSize, pageIndex);
  //  }

  /**
   * 获取书籍详情,(浏览自己的商品也会留下足迹,但不会更新商品的被浏览次数）
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @return 商品详情
   */
  @GetMapping("good/getGoodDetail")
  public Goods getGoodDetail(
      @RequestParam("userId") String userId, @RequestParam("goodId") String goodId) {
    Goods goods = goodService.getGoodDetail(userId, goodId, 1);

    // 更新浏览次数(游客浏览也要添加）
    goodService.updateGoodVisit(userId, goodId);

    // 非游客添加足迹
    if (!userId.equals("") && !userId.equals("undefined")) {
      footprintService.addFootprintItem(userId, goodId);
    }
    return goods;
  }

  /**
   * 获取卖家信息
   *
   * @param goodId 商品编号
   * @return 卖家昵称nickname和用户编号userId
   */
  @GetMapping("good/getSellerInfo")
  public Map<String, String> getSellerInfo(@RequestParam("goodId") String goodId) {
    return goodService.getSeller(goodId);
  }

  /**
   * 查看商品在自己购物车中的数量
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @return 商品在自己购物车中的数量
   */
  @GetMapping("good/getInCarCount")
  public int getInCarCount(
      @RequestParam("userId") String userId, @RequestParam("goodId") String goodId) {
    return shoppingCarService.getGoodCountInMyCar(userId, goodId);
  }

  /**
   * 将商品添加到购物车
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @param count 数量
   * @return 添加成功返回条目编号，否则返回0
   */
  @GetMapping("good/addToShoppingCar")
  public String addToShoppingCar(
      @RequestParam("userId") String userId,
      @RequestParam("goodId") String goodId,
      @RequestParam("count") int count) {
    return shoppingCarService.addToMyCar(userId, goodId, count);
  }

  /**
   * 判断商品编号为goodId的商品是否在编号为userId的用户的收藏列表中
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @return 是返回1，不是返回0
   */
  @GetMapping("good/isInCollection")
  public int isInCollection(
      @RequestParam("userId") String userId, @RequestParam("goodId") String goodId) {
    return collectionService.isGoodInMyCollection(userId, goodId);
  }

  /**
   * 将商品编号为goodId的商品添加到编号为userId的用户的收藏列表中
   *
   * @param userId 用户编号
   * @param goodId 待添加到商品收藏列表的商品编号
   * @return 添加成功返回1，否则返回0（如果已经在收藏中就会失败)
   */
  @GetMapping("good/addToCollection")
  public String addToCollection(
      @RequestParam("userId") String userId, @RequestParam("goodId") String goodId) {
    int ret = collectionService.addGoodToGoodsCollection(userId, goodId);
    return String.valueOf(ret);
  }

  /**
   * 获取相关书籍
   *
   * @param goodId 书籍编号
   * @return 相关书籍列表
   */
  @GetMapping("good/getRelevantGoods")
  public List<GoodsBasic> getRelevantGoods(@RequestParam("goodId") String goodId) {
    return goodService.getRelevantGoods(goodId);
  }
//  获取该书籍的作者其他作品
  @GetMapping("good/getAuthorGoods")
  public List<GoodsBasic> getAuthorGoods(@RequestParam("goodId") String goodId) {
    return goodService.getAuthorGoods(goodId);
  }


  @GetMapping("good/getAlsoViewGoods")
  public List<GoodsBasic> getAlsoViewGoods(
      @RequestParam("goodId") String goodId, @RequestParam("count") int count, String userId) {
    return goodService.getAlsoViewGoods(goodId, count, userId);
  }

  /**
   * 获取相关分类
   *
   * @param goodId 书籍编号
   * @return 相关分类列表
   */
  @GetMapping("good/getRelevantCategories")
  public List<Map<String, Object>> getRelevantCategories(@RequestParam("goodId") String goodId) {
    return goodService.getRelevantCategories(goodId);
  }

  /**
   * 举报书籍
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @param type 举报类型
   * @param reason 举报原因
   * @param pic1 证据截图1
   * @param pic2 证据截图2
   * @param pic3 证据截图3
   * @return 成功返回1，失败返回0
   */
  @PostMapping("good/reportGood")
  public String reportGood(
      @RequestParam("userId") String userId,
      @RequestParam("goodId") String goodId,
      @RequestParam("type") String type,
      @RequestParam("reason") String reason,
      MultipartFile pic1,
      MultipartFile pic2,
      MultipartFile pic3) {
    int ret = goodService.reportGood(userId, goodId, type, reason, pic1, pic2, pic3);
    return String.valueOf(ret);
  }

  @GetMapping("getTypeGoodCount")
  public List<Map<String, Object>> getTypeGoodCount() {
    return goodService.getTypeGoodCount();
  }
}
